package com.tianyuan.lims.utils;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

/**
 * @author: WZC
 */
public class GPSFormatUtils {

    public static void main(String[] args) {
        System.out.println(DDtoDMS(121.278429));
        System.out.println(DDtoDMS(31.095757));
        System.out.println(DmsTurnD("121.278429"));
        System.out.println(DmsTurnD("31.095757"));
    }

    /**
     * 功能：         度-->度分秒
     *
     * @param d 传入待转化格式的经度或者纬度
     */
    public static String DDtoDMS(Double d) {

        String[] array = d.toString().split("[.]");
        String degrees = array[0];//得到度

        Double m = Double.parseDouble("0." + array[1]) * 60;
        String[] array1 = m.toString().split("[.]");
        String minutes = array1[0];//得到分

        Double s = Double.parseDouble("0." + array1[1]) * 60;
        String[] array2 = s.toString().split("[.]");
        String seconds = array2[0];//得到秒
        return (degrees + "°" + minutes + "′" + seconds + "″");
    }

    /**
     * 功能：  度-->度分秒（满足图片格式）
     *
     * @param d 传入待转化格式的经度或者纬度
     * @return
     */
    public static String DDtoDMS_photo(Double d) {

        String[] array = d.toString().split("[.]");
        String D = array[0];//得到度

        Double m = Double.parseDouble("0." + array[1]) * 60;
        String[] array1 = m.toString().split("[.]");
        String M = array1[0];//得到分

        Double s = Double.parseDouble("0." + array1[1]) * 60 * 10000;
        String[] array2 = s.toString().split("[.]");
        String S = array2[0];//得到秒
        return D + "/1," + M + "/1," + S + "/10000";
    }

    public static Double tranformPos(String lng) {
        String[] lntArr = lng
                .trim()
                .replace("°", ";")
                .replace("′", ";")
                .replace("'", ";")
                .replace("\"", "")
                .split(";");
        Double result = 0D;
        for (int i = lntArr.length; i > 0; i--) {
            double v = Double.parseDouble(lntArr[i - 1]);
            if (i == 1) {
                result = v + result;
            } else {
                result = (result + v) / 60;
            }
        }
        return result;
    }

    /**
     * 表示角度的度、分、秒分别使用°、′、″符号进行表示。
     * 1°=60′，1′=60″ ，1°=3600″。
     * 由上述可知度分秒转换度的计算公式为：(dd°mm′ss″) dd+mm/60+ss/3600
     * 经纬度转换 ，度分秒转度
     *
     * @param jwd
     * @return
     */
    public static String DmsTurnD(String jwd) {
        try {
            if (StringUtils.isNotEmpty(jwd) && (jwd.contains("°"))) {//如果不为空并且存在度单位
                //计算前进行数据处理
                jwd = jwd.replace("E", "").replace("N", "").replace(":", "").replace("：", "");
                double d = 0, m = 0, s = 0;
                d = Double.parseDouble(jwd.split("°")[0]);
                //不同单位的分，可扩展
                if (jwd.contains("′")) {//正常的′
                    m = Double.parseDouble(jwd.split("°")[1].split("′")[0]);
                } else if (jwd.contains("'")) {//特殊的'
                    m = Double.parseDouble(jwd.split("°")[1].split("'")[0]);
                }
                //不同单位的秒，可扩展
                if (jwd.contains("″")) {//正常的″
                    //有时候没有分 如：112°10.25″
                    s = jwd.contains("′") ? Double.parseDouble(jwd.split("′")[1].split("″")[0]) : Double.parseDouble(jwd.split("°")[1].split("″")[0]);
                } else if (jwd.contains("''")) {//特殊的''
                    //有时候没有分 如：112°10.25''
                    s = jwd.contains("'") ? Double.parseDouble(jwd.split("'")[1].split("''")[0]) : Double.parseDouble(jwd.split("°")[1].split("''")[0]);
                }
                jwd = String.valueOf(d + m / 60 + s / 60 / 60);//计算并转换为string
            }
        } catch (Exception e) {
            return jwd;
        }
        return jwd;
    }


    /**
     * 度分 转度
     * 十进制经纬度转换 ddd°mm.mmmm' 转 ddd.ddddd°
     * 如：112°30.4128' = 112.50688
     *
     * @param jwd
     * @return
     */
    public static String DmTurnD(String jwd) {
        try {
            if (StringUtils.isNotEmpty(jwd) && (jwd.contains("°") && jwd.contains("'"))) {//如果不为空并且存在度、分单位
                double d = 0, m = 0;
                d = Double.parseDouble(jwd.split("°")[0]);
                m = Double.parseDouble(jwd.split("°")[1].split("'")[0]) / 60;
                jwd = String.valueOf(d + m);
            } else if (StringUtils.isNotEmpty(jwd) && (jwd.contains("°"))) {//如果不为空并且存在度单位
                double d = 0, m = 0;
                d = Double.parseDouble(jwd.split("°")[0]);
                m = Double.parseDouble(jwd.split("°")[1]) / 60;
                jwd = String.valueOf(d + m);
            }
        } catch (Exception e) {
            return jwd;
        }
        return jwd;
    }

    /**
     * 将经纬度转换为度分秒格式
     *
     * @param dushu 116.418847
     * @return 116°25'7.85"
     */
    public static String changeToDFM(String dushu) {
        return formatToDFM(dushu, "");
    }

    /**
     * 格式化到度分秒
     *
     * @param dushu    116.418847
     * @param enSuffix 116°25'7.85"
     * @return
     */
    public static String formatToDFM(String dushu, String enSuffix) {
        enSuffix = StringUtils.defaultString(enSuffix);

        if (StringUtils.endsWithAny(dushu, "E", "N")) {
            enSuffix = StringUtils.substring(dushu, dushu.length() - 1);
            dushu = StringUtils.substring(dushu, 0, dushu.length() - 1);
        }

        if (StringUtils.contains(dushu, "°") || !NumberUtils.isParsable(dushu)) {
            return dushu + enSuffix;
        }

        double du = Double.parseDouble(dushu);
        int du1 = (int) du;
        double tp = (du - du1) * 60;
        int fen = (int) tp;
        String miao = String.format("%.2f", Math.abs(((tp - fen) * 60)));

        return du1 + "°" + Math.abs(fen) + "'" + miao + "\"" + enSuffix;
    }

    public static String changeToDFM(double du) {
        int du1 = (int) du;
        double tp = (du - du1) * 60;
        int fen = (int) tp;
        String miao = String.format("%.2f", Math.abs(((tp - fen) * 60)));
        return du1 + "°" + Math.abs(fen) + "'" + miao + "\"";
    }
}
